package work818;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 Class类:反射的核心类，可以获取类的属性，方法等内容信息。
 Field类:Java.lang.reflect.表示类的属性，可以获取和设置类的中属性值。
 Method类:Java.lang.reflect。表示类的方法，它可以用来获取类中方法的信息或者执行方法
 Construcor类:Java.lang.reflect。表示类的构造方法。
 (1)使用Java反射获取类的信息
 (2)使用Java反射获取类的构造方法的参数列表，并通过构造方法实例化对象
 (3)使用Java反射获取类的所有方法的信息，并调用类的setter方法进行属性的赋值
 (4)使用Java反射获取类的所有属性的名称和类型，并为给属性赋值
 **/
public class Test {
  public static void main(String[] args) {

    try {
      Class<?>aClass = Class.forName("work818.Person");
      Object obj = aClass.newInstance();
      System.out.println("获取类的完全限定名："+aClass.getName());
      System.out.println("获取类的实例的名称："+aClass.getSimpleName());//getSimpleName()方法获取未知类的简称(不包括包名)
      System.out.println("获取获取所传类从java语言规范定义的格式输出："+aClass.getCanonicalName());
      System.out.println("类所在包：" + aClass.getPackage()); //getPackage()获取未知类的包名
      System.out.println("获取类访问修饰符：" + Modifier.toString(aClass.getModifiers())); //获取类真实的修饰符   Modifier工具类   toString()根据传入访问修饰符转换为对应字符串形式的修饰符
      System.out.println("获取该类的父类Class对象：" + aClass.getSuperclass());  //getSuperclass()方法获取该类的父类Class对象
      System.out.println("获取该类实现的所有实现的接口：");
      Class<?>[] interfaces = aClass.getInterfaces();  //获取该类实现所有接口Class对象
      System.out.println("打印该类实现所有接口完全限类名：");
      for ( Class<?> anInterface : interfaces) {
        System.out.println(anInterface.getName());
      }

      Field field1 = aClass.getDeclaredField("name");
      field1.setAccessible(true);
      field1.set(obj,"yzx");

      Field field2 = aClass.getDeclaredField("sex");
      field2.setAccessible(true);
      field2.set(obj,"男");

      Field field3 = aClass.getDeclaredField("age");
      field3.setAccessible(true);
      field3.setInt(obj,23);

      Field field4 = aClass.getDeclaredField("address");
      field4.setAccessible(true);
      field4.set(obj,"肥西");

      Field field5 = aClass.getDeclaredField("phone");
      field5.setAccessible(true);
      field5.set(obj,"15256271568");


      Method method =  aClass.getMethod("toString",new Class[]{});
      System.out.println(method.invoke(obj,new Object[]{}));


    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
